package base.cglib;

import com.itheima.service.UserService;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * @program: Spring_day01_01_IOC入门程序
 * @description: 对原始的操作做增强（装饰者模式）【没看懂】
 * @author: xuejingjing
 * @create: 2021-08-06 09:08
 **/
public class UserServiceCglibProxy {
    //返回一个代理对象
    public static UserService createUserServiceCglibProxy(Class clazz){
        //在内存中创建一个字节码
        //创建一个动态的字节码
        Enhancer enhancer = new Enhancer();
        //指定他的父类
        enhancer.setSuperclass(clazz);
        //匿名内部类
        enhancer.setCallback(new MethodInterceptor() {
            //这个o是最后被代理的类创建出来的对象
            public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
                /**System.out.println("==="+method.getName());
                 *这个打印出来的结果有：
                 * ===save
                 * ===toString
                 * ===hashCode
                 * 也就是这个增强是被代理的那个类所有方法都做增强
                 */

                Object ret = methodProxy.invokeSuper(o, args);
                //只对save方法做增强，不是save方法不做增强
                if (method.getName().equals("save")) {
                System.out.println("刮大白3");
                System.out.println("贴墙纸3");
            }
//                System.out.println("o1="+o1);

//               System.out.println(o.getClass());

                return ret;
            }
        });
        UserService us = (UserService) enhancer.create();
        return us;
    }

}
